#include <iostream>
#include <type_traits>
#include <string>
using namespace std;


// 1.万能引用推导规则
// 万能引用的核心在于c++模板类型推导机制
// 当传入左值时：T被推导为U&（引用类型）
// 当传入右值时：T被推导为U（非引用类型）
// 2.引用折叠规则，只要有左值引用，结果就是左值引用 
// 当T = int&时（左值情况）
// T&&  →  (int&) &&  →  int&     // 引用折叠后变成左值引用
// 当T = int时（右值情况）  
// T&&  →  int&&      →  int&&    // 直接是右值引用

template<typename T>
void f(T&& param)
{
    cout << "T is " << typeid(T).name() << endl;
     // 更准确的方法来区分类型
    if (is_lvalue_reference<T>::value) {
        cout << "T is an lvalue reference" << endl;
    } else {
        cout << "T is not an lvalue reference" << endl;
    }
}






int main()
{
    int a = 10;
    f(a);   // T 被推导为int&
    f(10);  // T 被推导为int
    
    // param的类型是 T&&

    // 调用 f(a) 时，a是左值：
    // T 被推导为 int& （根据万能引用规则）
    // param 的类型变为 (int&) && 
    // 根据引用折叠：(int&) && → int& （左值引用）

    // 调用 f(10) 时，10是右值：
    // T 被推导为 int （根据万能引用规则）
    // param 的类型变为 int&&
    // 无需引用折叠，直接是 int&& （右值引用）

    return 0;
}